//
//  ThisPoint.hpp
//  learnC++
//
//  Created by apple on 2018/6/3.
//  Copyright © 2018年 yunfan.com. All rights reserved.
//

#ifndef ThisPoint_hpp
#define ThisPoint_hpp

#include <stdio.h>
#include <iostream>


class Simple
{
private:
    int m_id;
    
public:
    Simple(int id)
    {
        setID(id);
    }
    
    void setID(int id) { m_id = id; }
    int getID() { return m_id; }
};


/*
 当我实例化该类时，
 Simple simple(1);
 simple.setID(2);
 std::cout << simple.getID() << '\n';
 
 
 当调用simple.setID(2);时
 看起来是一个参数，但是当编译的时候，实际上函数调用现在增加了一个参数，将对象的地址作为参数传递了过去setID(&simple, 2);
 
 void setID(int id) { m_id = id; }
 -> convert转变
 void setID(Simple* const this, int id) { this->m_id = id; }
 当编译器编译一个普通的成员函数时，它会隐式地向名为“this”的函数添加一个新参数。 这个指针是一个隐藏的const指针，它保存成员函数被调用的对象的地址。
 
setID（）中的任何成员变量都以“this->”作为前缀。 所以当我们说m_id = id时，编译器实际上正在执行this-> m_id = id，在这种情况下，它会将simple.m_id更新为id。
 
 Note:当创建多个对象，this怎么处理的呢？ 如：
 Simple A(1); // *this = &A inside the Simple constructor
 Simple B(2); // *this = &B inside the Simple constructor
 A.setID(3); // *this = &A inside member function setID
 B.setID(4); // *this = &B inside member function setID

 * this指针交替保存对象A或B的地址，具体取决于我们是否在对象A或B上调用了成员函数
 
 
 大多数情况下，你永远不需要明确引用“this”指针。 但是，有几次这样做可能有用：
 首先，如果你有一个构造函数（或成员函数），它的参数与成员变量名称相同，你可以使用“this”来消除它们的歧义：
 
 class Something
 {
 private:
 int data;
 
 public:
 Something(int data)
 {
 this->data = data;//通常命名规范的话不会有这种问题
 }
 };
 
 */

#endif /* ThisPoint_hpp */
